#pragma once
#include "gtest/gtest.h"

#include "Utility/FileSystem/SGFileSystem.h"

#include "../ChanSectionNumericalCalculator.h"
#include "../Interface/BeamSectionNumericalCalculatorFactory.h"
#include "../SectionCalculator/writeVtk.h"

using SG::DataStructure::FEM::BeamSectionStandardTypes;
using SG::DataStructure::FEM::PBARLData;
using SG::FEMSolver::Element::BeamSectionNumericalCalculatorFactory;
using SG::FEMSolver::Element::ChanSectionNumericalCalculator;

// 将 BeamSectionNumericalCalculatorFactory 生成对象测试放置在具体截面属性计算中
TEST (BeamSectionNumericalCalculatorFactoryTest, ChanSectionCalculatorCreate)
{
    // Test data
    auto calculatorPtr     = BeamSectionNumericalCalculatorFactory::Create (BeamSectionStandardTypes::BEAMSECTYPE_CHAN);
    auto chanCalculatorPtr = dynamic_cast<ChanSectionNumericalCalculator*> (calculatorPtr.get ());

    // Check
    ASSERT_TRUE (nullptr != chanCalculatorPtr);
}

// Chan 截面网格划分测试
TEST (BeamSectionNumericalMeshTest, ChanSection)
{
    // Input data
    PBARLData section;
    section.SetBeamSectionStandardTypes (BeamSectionStandardTypes::BEAMSECTYPE_CHAN);
    section.m_dimension = { 20.0, 50.0, 5.0, 10.0 };
    int refineLevel{ 1 };

    // Test data
    Meshes                         meshes;
    ChanSectionNumericalCalculator ChanSecMesher;
    ChanSecMesher.Mesh (section, _OUT meshes, refineLevel);
    std::string filename    = "ChanBeamSectionMesh";
    std::string discription = "CHAN-Type Beam Section Mesh";
    SG::FEMSolver::Element::writeVtk (meshes, filename, discription);
    auto fileTest = SG::Utility::FileSystem::getFullPath (filename + ".vtk");

    // Target data
    auto fileTarget = SG::Utility::FileSystem::getTestDataPath ("SGFem/BeamSecPropCalculator/" + filename + "Target.vtk");

    // Check
    ASSERT_TRUE (SG::Utility::FileSystem::compareVTK (fileTarget, fileTest));
}